#include "echo.hpp"

int main()
{
    EchoServer server(8080);
    server.Start();
    return 0;
}


// #include <iostream>
// #include <string>
// #include <vector>
// #include <map>
// #include <cstdlib>
// #include <ctime>
// #include <cstdio>
// #include <cstring>
// #include <sys/types.h>
// #include <sys/socket.h>
// #include <netinet/in.h>
// #include <arpa/inet.h>
// #include <unistd.h>

// using namespace std;

// // 棋盘大小
// const int BOARD_SIZE = 15;

// // 棋子颜色
// enum class StoneColor {
//     BLACK,
//     WHITE
// };

// // 棋子状态
// enum class StoneState {
//     EMPTY,
//     BLACK,
//     WHITE
// };

// // 棋子位置
// struct StonePos {
//     int x;
//     int y;
// };

// // 玩家信息
// struct PlayerInfo {
//     string name;
//     StoneColor color;
// };

// // 游戏状态
// struct GameState {
//     StoneState board[BOARD_SIZE][BOARD_SIZE]; // 棋盘状态
//     vector<StonePos> moves; // 所有落子位置的历史记录
//     int currentMoveIndex; // 当前落子的索引
//     StoneColor currentPlayer; // 当前落子的玩家
//     map<int, PlayerInfo> players; // 所有加入游戏的玩家信息
// };

// // 初始化游戏状态
// void initGameState(GameState& gameState) {
//     // 将所有棋子设置为空状态
//     for (int i = 0; i < BOARD_SIZE; i++) {
//         for (int j = 0; j < BOARD_SIZE; j++) {
//             gameState.board[i][j] = StoneState::EMPTY;
//         }
//     }

//     // 当前落子从第一步开始
//     gameState.currentMoveIndex = 0;

//     // 随机选择一个玩家作为先手
//     srand(time(nullptr));
//     int playerIndex = rand() % gameState.players.size();
//     auto it = gameState.players.begin();
//     std::advance(it, playerIndex);
//     gameState.currentPlayer = it->second.color;
// }

// // 判断当前位置是否在棋盘范围内
// bool isPosValid(int x, int y) {
//     return (x >= 0 && x < BOARD_SIZE && y >= 0 && y < BOARD_SIZE);
// }

// // 判断当前位置是否为空
// bool isPosEmpty(const GameState& gameState, int x, int y) {
//     return (gameState.board[x][y] == StoneState::EMPTY);
// }

// // 判断当前位置是否可落子
// bool isPosValidForMove(const GameState& gameState, int x, int y) {
//     return (isPosValid(x, y) && isPosEmpty(gameState, x, y));
// }

// // 判断当前位置是否是五子连珠
// bool isWinningMove(const GameState& gameState, int x, int y) {
//     // 横向
//     int count = 1;
//     for (int i = x - 1; i >= 0; i--) {
//         if (gameState.board[i][y] == gameState.board[x][y]) {
//             count++;
//         } else {
//             break;
//         }
//     }
//     for (int i = x + 1; i < BOARD_SIZE; i++) {
//         if (gameState.board[i][y] == gameState.board[x][y]) {
//             count++;
//         } else {
//             break;
//         }
//     }
//     if (count >= 5) return true;

//     // 纵向
//     count = 1;
//     for (int i = y - 1; i >= 0; i--) {
//         if (gameState.board[x][i] == gameState.board[x][y]) {
//             count++;
//         } else {
//             break;
//         }
//     }
//     for (int i = y + 1; i < BOARD_SIZE; i++) {
//         if (gameState.board[x][i] == gameState.board[x][y]) {
//             count++;
//         } else {
//             break;
//         }
//     }
//     if (count >= 5) return true;

//     // 斜线
//     count = 1;
//     for (int i = x - 1, j = y - 1; i >= 0 && j >= 0; i--, j--) {
//         if (gameState.board[i][j] == gameState.board[x][y]) {
//             count++;
//         } else {
//             break;
//         }
//     }
//     for (int i = x + 1, j = y + 1; i < BOARD_SIZE && j < BOARD_SIZE; i++, j++) {
//         if (gameState.board[i][j] == gameState.board[x][y]) {
//             count++;
//         } else {
//             break;
//         }
//     }
//     if (count >= 5) return true;

//     // 反斜线
//     count = 1;
//     for (int i = x - 1, j = y + 1; i >= 0 && j < BOARD_SIZE; i--, j++) {
//         if (gameState.board[i][j] == gameState.board[x][y]) {
//             count++;
//         } else {
//             break;
//         }
//     }
//     for (int i = x + 1, j = y - 1; i < BOARD_SIZE && j >= 0; i++, j--) {
//         if (gameState.board[i][j] == gameState.board[x][y]) {
//             count++;
//         } else {
//             break;
//         }
//     }
//     return (count >= 5);
// }

// // 处理玩家加入游戏的请求
// void handlePlayerJoinRequest(int sock, GameState& gameState) {
//     // 接收客户端发送的玩家信息
//     PlayerInfo playerInfo;
//     recv(sock, &playerInfo, sizeof(playerInfo), 0);

//     // 随机分配一个颜色给玩家
//     srand(time(nullptr));
//     int color = rand() % 2;
//     playerInfo.color = (color == 0 ? StoneColor::BLACK : StoneColor::WHITE);

//     // 将玩家信息添加到游戏状态中
//     int playerId = (int)gameState.players.size() + 1;
//     gameState.players[playerId] = playerInfo;

//     // 发送玩家加入成功的响应
//     send(sock, &playerId, sizeof(playerId), 0);

//     // 如果当前已经有两个玩家加入游戏，则开始游戏
//     if (gameState.players.size() == 2) {
//         initGameState(gameState);
//     }
// }

// // 处理玩家落子的请求
// void handleMoveRequest(int sock, GameState& gameState) {
//     // 接收客户端发送的落子信息
//     StonePos stonePos;
//     recv(sock, &stonePos, sizeof(stonePos), 0);

//     // 判断当前位置是否可落子
//     if (!isPosValidForMove(gameState, stonePos.x, stonePos.y)) {
//         // 发送落子无效的响应
//         int result = 0;
//         send(sock, &result, sizeof(result), 0);
//         return;
//     }

//     // 更新棋盘状态
//     gameState.board[stonePos.x][stonePos.y] = (gameState.currentPlayer == StoneColor::BLACK ? StoneState::BLACK : StoneState::WHITE);
//     gameState.moves.push_back(stonePos);

//     // 判断是否五子连珠
//     if (isWinningMove(gameState, stonePos.x, stonePos.y)) {
//         // 发送游戏结束的响应
//         int result = 1; // 1 表示黑方胜利，2 表示白方胜利
//         if (gameState.currentPlayer == StoneColor::BLACK) {
//             result = 2;
//         }
//         send(sock, &result, sizeof(result), 0);
//         return;
//     }

//     // 更新当前玩家和落子索引
//     gameState.currentPlayer = (gameState.currentPlayer == StoneColor::BLACK ? StoneColor::WHITE : StoneColor::BLACK);
//     gameState.currentMoveIndex++;

//     // 发送落子成功的响应
//     int result = 1;
//     send(sock, &result, sizeof(result), 0);
// }

// // 处理客户端连接
// void handleClientConnection(int sock, GameState& gameState) {
//     while (true) {
//         // 接收客户端发送的请求类型
//         int requestType = 0;
//         recv(sock, &requestType, sizeof(requestType), 0);

//         switch (requestType) {
//             case 0: // 玩家加入游戏的请求
//                 handlePlayerJoinRequest(sock, gameState);
//                 break;
//             case 1: // 玩家落子的请求
//                 handleMoveRequest(sock, gameState);
//                 break;
//             default:
//                 // 未知请求类型，直接关闭客户端连接
//                 close(sock);
//                 return;
//         }
//     }
// }

// int main(int argc, char* argv[]) {
//     GameState gameState;

//     // 创建监听套接字
//     int listenSock = socket(AF_INET, SOCK_STREAM, 0);

//     // 绑定地址和端口
//     struct sockaddr_in serverAddr;
//     serverAddr.sin_family = AF_INET;
//     serverAddr.sin_port = htons(8080);
//     serverAddr.sin_addr.s_addr = INADDR_ANY;
//     memset(&(serverAddr.sin_zero), '\0', 8);
//     bind(listenSock, (struct sockaddr*)&serverAddr, sizeof(serverAddr));

//     // 开始监听连接请求
//     listen(listenSock, 5);

//     while (true) {
//         // 接受客户端连接
//         struct sockaddr_in clientAddr;
//         socklen_t clientAddrLen = sizeof(clientAddr);
//         int clientSock = accept(listenSock, (struct sockaddr*)&clientAddr, &clientAddrLen);

//         // 处理客户端连接
//         handleClientConnection(clientSock, gameState);
//     }

//     return 0;
// }
